'use strict'
import AtRule from './at-rule'
import Comment from './comment'
import Container from './container'
import CssSyntaxError from './css-syntax-error'
import Declaration from './declaration'
import Document from './document'
import fromJSON from './fromJSON'
import Input from './input'
import LazyResult from './lazy-result'
import { default as list } from './list'
import Node from './node'
import parse from './parse'
import Processor from './processor'
import Result from './result'
import Root from './root'
import Rule from './rule'
import stringify from './stringify'
import Warning from './warning'

function postcss(...plugins) {
    if (plugins.length === 1 && Array.isArray(plugins[0])) {
        plugins = plugins[0]
    }
    return new Processor(plugins)
}

postcss.plugin = function plugin(name, initializer) {
    let warningPrinted = false

    function creator(...args) {
        // eslint-disable-next-line no-console
        if (console && console.warn && !warningPrinted) {
            warningPrinted = true
            // eslint-disable-next-line no-console
            console.warn(
                name +
                    ': postcss.plugin was deprecated. Migration guide:\n' +
                    'https://evilmartians.com/chronicles/postcss-8-plugin-migration'
            )
            if (process.env.LANG && process.env.LANG.startsWith('cn')) {
                /* c8 ignore next 7 */
                // eslint-disable-next-line no-console
                console.warn(
                    name +
                        ': 里面 postcss.plugin 被弃用. 迁移指南:\n' +
                        'https://www.w3ctech.com/topic/2226'
                )
            }
        }
        let transformer = initializer(...args)
        transformer.postcssPlugin = name
        transformer.postcssVersion = new Processor().version
        return transformer
    }

    let cache
    Object.defineProperty(creator, 'postcss', {
        get() {
            if (!cache) {
                cache = creator()
            }
            return cache
        }
    })

    creator.process = function (css, processOpts, pluginOpts) {
        return postcss([creator(pluginOpts)]).process(css, processOpts)
    }

    return creator
}

postcss.stringify = stringify
postcss.parse = parse
postcss.fromJSON = fromJSON
postcss.list = list

postcss.comment = defaults => new Comment(defaults)
postcss.atRule = defaults => new AtRule(defaults)
postcss.decl = defaults => new Declaration(defaults)
postcss.rule = defaults => new Rule(defaults)
postcss.root = defaults => new Root(defaults)
postcss.document = defaults => new Document(defaults)

postcss.CssSyntaxError = CssSyntaxError
postcss.Declaration = Declaration
postcss.Container = Container
postcss.Processor = Processor
postcss.Document = Document
postcss.Comment = Comment
postcss.Warning = Warning
postcss.AtRule = AtRule
postcss.Result = Result
postcss.Input = Input
postcss.Rule = Rule
postcss.Root = Root
postcss.Node = Node

LazyResult.registerPostcss(postcss)

export { postcss }
